# 异常：指在程序运行时出现的错误，xxxError

# 异常处理
"""
格式：
try：
    可能出现异常的代码
expect：
    如果有异常执行的代码
[finally：(可有可无)
    无论是否存在异常都会被执行的代码]

情况1：
    try：
        有可能会产生多种异常
    except：异常类型1：
        print(.......)
    except:异常类型2：
        pass
    except：异常类型...
        ......
    except Exception:
        pass

如果是多个except，异常类型的顺序需要注意，最大的Exception要放到最后

情况2：获取Exception的错误原因
    try：
        有可能会产生多种异常
    except：异常类型1：
        print(.......)
    except：异常类型...
        ......
    except Exception as err:
        print(err)  ---> err的内容就是错误原因

情况3：
    try：
        有可能有异常的代码
    except：类型1：
        pass
        ...
    else：
        如果try中没有发生异常则进入的代码（不报异常才进）

注意：如果使用else则在try代码中不能出现return,
     return会导致函数提前返回,而不会执行到else语句

情况4：
    try：
        pass
    expect：
        pass
    finally：
        pass（报不报异常都会进）
"""


# 抛出异常 raise


def func():
    try:
        n1 = int(input("输入第一个数字："))
        n2 = int(input("输入第二个数字:"))
        # 选择运算符号
        per = input("输入运算符号（+ - * /）：")

        result = 0
        if per == "+":
            result = n1 + n2
        elif per == "-":
            result = n1 - n2
        elif per == "*":
            result = n1 * n2
        elif per == "/":
            result = n1 / n2
        else:
            print("符号输入错误！")

        print("结果是：", result)

        # 文件操作
        with open(r"D:\原文件夹\材料4.txt", "r") as r_stream:
            print(r_stream.read())

    except ZeroDivisionError:
        print("除数不能为零！!! ")
    except ValueError:
        print("必须要输入数字！！！")
    except Exception as err:  # 还有不清楚的错误可以使用except Exception as err句式
        print("出错啦！", err)  # 打印出具体错误原因


func()
print("-------->")


def func_1():
    try:
        n3 = int(input("输入数字："))
        print(n3)
        return 1  # 返回1表示操作成功
    except ValueError:
        print("必须是数字...")
        return 2  # # 返回2表示操作失败
    # else:
    #     print("数字输入完毕！")


func_1()  # 可以print(func_1)来检查返回值


def func_3():
    stream = None  # 在外部声明变量stream，三个模块均可调用
    try:
        # Python在读取文件时，默认使用系统编码(在Windows上通常是GBK),而文件的实际编码(UTF-8)与之不匹配
        stream = open(r"D:\原文件夹\books.txt", encoding="UTF-8")  # 编码"UTF-8"要加引号，是字符串
        vessel = stream.read()
        print(vessel)
        return 1
    except Exception as err:
        print(err)
        return 2
    finally:
        print("-----finally-----")
        if stream:
            stream.close()
        return 3


x = func_3()
print(x)


# 注册，用户名必须6位
def register():
    username = input("请输入用户名：")
    if len(username) < 6:
        # raise 异常类型（“提示信息”）
        raise Exception("用户长度必须在6位以上")  # 自定义条件时需要手动抛出异常，一般系统会自动报异常
    else:
        print("输入的用户名是：", username)


# 接收异常并进行处理
try:
    register()
except Exception as err:
    print(err)
    print("注册失败！")
else:
    print("注册成功！")
